home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 11 / Cream of the Crop 11-1.iso / comm / ftp4w24b.zip / sample / main.c < prev    next >
C/C++ Source or Header  |  1995-11-26  |  28KB  |  801 lines

  1. /* **************************************************************
  2.  *
  3.  *
  4.  *      C W _ M A I N 
  5.  * 
  6.  *  This program must be compiled with the model 'Large'
  7.  * **************************************************************** */
  8.  
  9.  
  10.  
  11. #define  STRICT
  12. #include <windows.h>
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15. #include <string.h>
  16. #include <ftp4w.h>
  17. #include "resource.h"
  18.  
  19. #ifdef _WIN32
  20. #  define _export
  21. #endif
  22.  
  23. #define  INIFILE_NAME   "CW_Main.ini" /* name of ini file */
  24. #define  LOG_FILE       "c:\\ftp4w.log"
  25.  
  26.  
  27. /* user's defined messages */
  28. #define  FTP_LOGGED          (WM_USER + 48)
  29. #define  FTP_DIR             (WM_USER + 51)
  30. #define  FTP_DIRLINEPERLINE  (WM_USER + 52)
  31. #define  FTP_FILETRANSFERED  (WM_USER + 54)
  32. #define  CW_VERBOSE          (WM_USER + 57)
  33. #define  CW_BEGIN            (WM_USER + 60)
  34. #define  CW_QUITAPP          (WM_USER + 63)
  35. #define  SHORT_DIR            FALSE       
  36.  
  37. #define  IsOptOn(x) (GetMenuState (GetMenu(hWnd),x,MF_BYCOMMAND)==MF_CHECKED)
  38.  
  39.  
  40.  
  41. int  nHorzSiz, nVertSiz;
  42. int  nVertPos, nHorzPos;           // scroll pos for debug window
  43. int  nHorzMax, nCurMsg;
  44. int  nMaxMsg;
  45. int  nHorzTab = 20;
  46.  
  47. #define         szAPPLICATION     "CW_MAIN"
  48.  
  49. HINSTANCE       hInst;             /* hInstance of application     */
  50. HWND            hwnd;              /* hWnd of main window          */
  51. BOOL            FirstEmission;
  52. BOOL            bFileTransfer=FALSE; /* TRUE->data transfer in progress */
  53. char            szQuoteCmd[128];     /* Quote Command */
  54. HFILE           hLogFile=HFILE_ERROR; /* Log File */
  55.  
  56.  
  57. /* in main2 : gauge window */
  58. void SetXmitBytes (LONG lBytes, LONG lTotalBytes);
  59. void DeleteXferWindow (void);
  60. void CreateXferWindow(void);
  61. void SetXferWindowText (LPSTR lpStr);
  62. int nCwRegisterClasses(void);
  63. int nCwUnregisterClasses(void);
  64. /* in main2 : scroller window */
  65. int  Ecris(const char *szFormat,...);
  66. void DoPrintf (char * szFormat, ...);
  67. void DoPaint (HWND hwnd);
  68. void DoAddLine (LPSTR szLine);                           
  69. void ReleaseDisplayMem(void);
  70.  
  71. /* in this file */
  72. BOOL InitApplication (HINSTANCE hInstance);
  73. BOOL InitInstance (HINSTANCE hInstance, int nCmdShow);
  74.  
  75.  
  76. /* different system names */
  77. char *szSyst[] = { "Dos", "Windows", 
  78.                    "Unix", "VMS", "CMS", "OS2", NULL };
  79.  
  80. /* ------------------------------ */
  81. /* Get informations from INI file */
  82. /* ------------------------------ */
  83. LPSTR HOST_NAME(void) 
  84. {
  85. static char szBuf[256];
  86.  GetPrivateProfileString ("Connect", "Host", "", szBuf,256, INIFILE_NAME);
  87.   if (szBuf[0]==0)
  88.     {
  89.       MessageBox ( NULL,
  90.                    "Field Host not defined in Cw_Main.Ini", 
  91.                    "CW_MAIN", MB_OK);
  92.       return NULL;
  93.     }
  94.   return szBuf; }  
  95.                         
  96.  
  97. LPSTR USER_NAME(void) 
  98. {
  99. static char szBuf[256];
  100.  GetPrivateProfileString ("Connect", "User", "", szBuf,256, INIFILE_NAME);
  101.   if (szBuf[0]==0)
  102.     {
  103.       MessageBox ( NULL,
  104.                    "Field User not defined in Cw_Main.Ini", 
  105.                    "CW_MAIN", MB_OK);
  106.       return NULL;
  107.     }
  108.   return szBuf; }  
  109.  
  110.  
  111. LPSTR PASSWD_NAME(void) 
  112. {
  113. static char szBuf[256];
  114.  GetPrivateProfileString ("Connect", "PassWd", "", szBuf,256, INIFILE_NAME);
  115.   if (szBuf[0]==0)
  116.     {
  117.       MessageBox ( NULL,
  118.                    "Field PassWd not defined in Cw_Main.Ini", 
  119.                    "CW_MAIN", MB_OK);
  120.       return NULL;
  121.     }
  122.   return szBuf; }  
  123.                         
  124. LPSTR LOCALFILE_NAME(void) 
  125. {
  126. static char szBuf[256];
  127.  GetPrivateProfileString ("Transfer", "LocalFile", "",szBuf,256,INIFILE_NAME);
  128.   if (szBuf[0]==0)
  129.     {
  130.       MessageBox ( NULL,
  131.                    "Field LocalFile not defined in Cw_Main.Ini", 
  132.                    "CW_MAIN", MB_OK);
  133.       return NULL;
  134.     }
  135.   return szBuf; }  
  136.                         
  137.                         
  138. LPSTR REMOTEFILE_NAME(void) 
  139. {
  140. static char szBuf[256];
  141.  GetPrivateProfileString ("Transfer", "RemoteFile", "",szBuf,256,INIFILE_NAME);
  142.   if (szBuf[0]==0)
  143.     {
  144.       MessageBox ( NULL,
  145.                    "Field RemoteFile not defined in Cw_Main.Ini", 
  146.                    "CW_MAIN", MB_OK);
  147.       return NULL;
  148.     }
  149.   return szBuf; }  
  150.  
  151.  
  152. LPSTR NEWREMOTEFILE_NAME(void) 
  153. {
  154. static char szBuf[256];
  155.  GetPrivateProfileString ("Rename", "NewRemoteFile", "",szBuf,256,INIFILE_NAME);
  156.   if (szBuf[0]==0)
  157.     {
  158.       MessageBox ( NULL,
  159.                    "Field NewRemoteFile not defined in Cw_Main.Ini", 
  160.                    "CW_MAIN", MB_OK);
  161.       return NULL;
  162.     }
  163.   return szBuf; }  
  164.  
  165.  
  166. LPSTR REMOTE_DIR(void) 
  167. {
  168. static char szBuf[256];
  169.  GetPrivateProfileString ("Directory", "HostDir", "", szBuf,256, INIFILE_NAME);
  170.   if (szBuf[0]==0)
  171.     {
  172.       MessageBox ( NULL,
  173.                    "Field HostDir not defined in Cw_Main.Ini", 
  174.                    "CW_MAIN", MB_OK);
  175.       return NULL;
  176.     }
  177.   return szBuf; }  
  178.  
  179.  
  180.  
  181. long FileSize (LPSTR szFile)
  182. {
  183. HFILE hF;
  184. long FS;
  185.   hF = _lopen (szFile, 0);
  186.   if (hF==HFILE_ERROR)  return 0;
  187.   FS = _llseek (hF, 0, SEEK_END);
  188.   _lclose (hF);
  189. return FS;
  190. } /* FileSize */
  191.  
  192. //*******************************************************************
  193. LRESULT CALLBACK _export CBQuoteDlg (HWND hWndDlg, UINT message,
  194.                                 WPARAM wParam, LPARAM lParam)
  195. {
  196.    if (message==WM_INITDIALOG)
  197.     {  
  198.       SetDlgItemText (hWndDlg, IDC_QUOTECMD, szQuoteCmd);
  199.       SetFocus (GetDlgItem (hWndDlg, IDC_QUOTECMD));
  200.     }
  201.    if (message==WM_COMMAND)
  202.     {
  203.       switch (wParam)
  204.         {
  205.           case IDOK : GetDlgItemText (hWndDlg, IDC_QUOTECMD, 
  206.                                      szQuoteCmd, sizeof szQuoteCmd);
  207.                       EndDialog (hWndDlg, 0);
  208.                       break;
  209.           case IDCANCEL : EndDialog (hWndDlg, -1);
  210.         }
  211.     }
  212. return FALSE;     
  213. } /* CBQuoteDlgf */                    
  214.  
  215. //*******************************************************************
  216. LRESULT CALLBACK _export MainWndProc (HWND hWnd, UINT message,
  217.                                 WPARAM wParam, LPARAM lParam)
  218. {
  219. static char szBuf[10240];
  220. static char szWinDir[145], szExecCmd [256];
  221. int         Rc;
  222. LPSTR       p, q;
  223. HFILE       hF, hFile;
  224. FARPROC     lpfnQuoteDlg;
  225.  
  226. static HFILE hZ;
  227.  
  228.     switch (message)
  229.     {
  230.        case WM_CREATE :
  231.           hwnd = hWnd;
  232.           SetScrollPos (hWnd, SB_HORZ, 0, TRUE);
  233.           SetScrollPos (hWnd, SB_VERT, 0, TRUE);
  234.           SetScrollRange (hWnd, SB_HORZ, 0, 1, TRUE);
  235.           SetScrollRange (hWnd, SB_VERT, 0, 1, TRUE);
  236.           nVertPos = nHorzPos = nHorzMax = nCurMsg = 0;
  237.           nMaxMsg = 80;
  238.           nCwRegisterClasses();
  239.           PostMessage (hWnd, CW_BEGIN, 0, 0);
  240.           break;  
  241.  
  242.  
  243.  
  244.        case WM_VSCROLL:
  245.           switch(wParam)
  246.            {
  247.             case SB_LINEDOWN     : if (nVertPos<(nCurMsg-(nVertSiz>>1))) nVertPos++;  break;
  248.             case SB_LINEUP       : if (nVertPos>0) --nVertPos; break;
  249.             case SB_THUMBPOSITION: nVertPos = min ((WORD) (nCurMsg-(nVertSiz>>1)), LOWORD (lParam)); break;
  250.             case SB_PAGEUP       : nVertPos = (nVertPos>10) ? (nVertPos-10) : 0; break;
  251.             case SB_PAGEDOWN     : nVertPos = (nVertPos<(nCurMsg-nVertSiz)) ? (nVertPos+nVertSiz) : nCurMsg-(nVertSiz>>1); break;
  252.             default              : return 0L;
  253.            } /* switch wParam */
  254.           SetScrollPos (hWnd, SB_VERT, nVertPos, TRUE);
  255.           InvalidateRect (hWnd, NULL, TRUE); 
  256.           return 0L;
  257.  
  258.        case WM_HSCROLL:
  259.           switch (wParam)
  260.            {
  261.             case SB_LINEDOWN     : nHorzPos = (nHorzPos<(nHorzMax-nHorzTab)) ? (nHorzPos+nHorzTab) : nHorzMax; break;
  262.             case SB_LINEUP       : nHorzPos = (nHorzPos>nHorzTab) ? (nHorzPos-nHorzTab) : 0; break;
  263.             case SB_THUMBPOSITION: nHorzPos = min ((WORD) nHorzMax, LOWORD (lParam)); break;
  264.             case SB_PAGEUP       : nHorzPos = (nHorzPos>nHorzSiz) ? (nHorzPos-nHorzSiz) : 0; break;
  265.             case SB_PAGEDOWN     : nHorzPos = (nHorzPos<(nHorzMax-nHorzSiz)) ? (nHorzPos+nHorzSiz) : nHorzMax; break;
  266.             default              : return 0L;
  267.            }
  268.           SetScrollPos (hWnd, SB_HORZ, nHorzPos, TRUE);
  269.           InvalidateRect (hWnd, NULL, TRUE); 
  270.           return 0L;
  271.  
  272.       case WM_PAINT :
  273.           DoPaint (hWnd);
  274.           break;
  275.           
  276.    /* ---------------------------------------------------------- */
  277.  
  278.        case CW_BEGIN :
  279.  
  280.  DoAddLine ("----------------------------------------------------------------");
  281. #ifdef FRANCAIS
  282.           DoAddLine ("Exemple de Programme utilisant FTP4W.DLL");
  283.           DoAddLine ("Les paramΦtres (nom du distant, nom d'utilisateur,...)");
  284.           DoAddLine ("doivent Ωtre entrΘs dans le fichier CW_MAIN.INI ");
  285.           DoAddLine ("comme le montre le fichier donnΘ sur la disquette.");
  286.           DoAddLine (" ");
  287.           DoAddLine ("Ce fichier doit Ωtre copiΘ dans le rΘpertoire de Windows");
  288.           DoAddLine ("Pour l'Θditer, utiliser la commande Options/Edit INI");
  289. #else
  290.           DoAddLine ("Sample program For FTP4W.DLL By Ph. Jounin");
  291.           DoAddLine ("Host description and file names must be defined");
  292.           DoAddLine ("in the file CW_MAIN.INI as shown in the INI file");
  293.           DoAddLine ("provided in the package FTP4W.ZIP.");
  294.           DoAddLine (" ");
  295.           DoAddLine ("Please report bugs and disfonctionments to");
  296.           DoAddLine ("           ark@ifh.sncf.fr");
  297.  #endif /* langues */
  298.  DoAddLine ("----------------------------------------------------------------");
  299.  
  300.           /* add version information */
  301.           Rc = Ftp4wVer (szBuf, sizeof szBuf);
  302.           Ecris ("Version %d.%02X", HIBYTE (Rc), LOBYTE(Rc));
  303.           DoAddLine (szBuf);   
  304.  DoAddLine ("----------------------------------------------------------------");
  305.  
  306.           /* initialize FTP sesson */  
  307.           Rc = FtpInit(hWnd);
  308.           if (Rc!= FTPERR_OK)   
  309.                 Ecris ("FtpInit failed !\nError Code %d", Rc);
  310.           else
  311.              {
  312.                 FtpSetDefaultTimeOut (30);       /* new Timeout : 30 seconds */
  313.                 FtpSetNewDelay(10);
  314.              }
  315.           break;
  316.  
  317.       case WM_CLOSE : 
  318.            DeleteXferWindow ();
  319.            FtpLocalClose ();
  320.            if (FtpRelease()!=FTPERR_OK) 
  321.                { 
  322.                  SetTimer (hWnd, 1, 500l, 0);
  323.                  return FALSE; 
  324.                }
  325.            else
  326.              {  
  327.                 ReleaseDisplayMem();
  328.                 DestroyWindow (hWnd);
  329.                 PostQuitMessage (0);
  330.              }
  331.             break;
  332.             
  333.       case WM_TIMER :
  334.            KillTimer (hWnd, 1);
  335.            FtpRelease ();
  336.            ReleaseDisplayMem();
  337.            DestroyWindow (hWnd);
  338.            PostQuitMessage (0);
  339.            break; 
  340.  
  341.       case WM_QUERYENDSESSION :
  342.           FtpLocalClose ();
  343.           FtpRelease ();
  344.           ReleaseDisplayMem();
  345.           DeleteXferWindow ();
  346.           break;
  347.  
  348.       /* --------------------- */
  349.       /* asynchronous Messages */
  350.       /* --------------------- */
  351.       case CW_VERBOSE :
  352.           Ecris ((LPSTR) lParam);
  353.           break;
  354.  
  355.       case FTP_LOGGED :
  356.           Ecris ("Asynchronous Login returns %d", (int) lParam);
  357.           break;
  358.  
  359.           /* Ftp4w sends a message each time an entry has been received */
  360.           /* lParam points on this entry, wParam is FALSE               */
  361.           /* If wParam is TRUE, the directory is finished, one gets the */
  362.           /* the return code of the function.                           */
  363.       case FTP_DIRLINEPERLINE :
  364.           if (! wParam)  DoAddLine ((LPSTR) lParam);
  365.           else  Ecris ("----> FtpDir Returns %d", (int) lParam);
  366.           break;
  367.  
  368.           /* Dir asynchrone : The dir file has been received */  
  369.       case FTP_DIR :
  370.           Ecris ("Dir returns %d", (int) lParam);
  371.           Ecris ("-------");
  372.           hF = _lopen ("$$dir$$.tmp", 0);
  373.           _lread (hF, szBuf, sizeof szBuf);
  374.           _lclose (hF);
  375.           for (p=szBuf ; (q=strchr (p,'\r')) !=NULL ; p=q+2 )
  376.               {  *q=0;
  377.                   DoAddLine (p); }
  378.           Ecris ("-------");
  379.           unlink ("$$dir$$.tmp");
  380.           break;
  381.  
  382.  
  383.        case FTP_FILETRANSFERED :
  384.           if (wParam)
  385.             {
  386.                DeleteXferWindow ();
  387.                Ecris ("Asynchronous transfer returns %d", (int) lParam);
  388.                bFileTransfer = FALSE;
  389.             }
  390.           else
  391.             {
  392.                SetXmitBytes (lParam, FtpBytesToBeTransferred ());
  393.             }  
  394.           break;
  395.                 
  396.  
  397.       /* --------------------- */
  398.       /*     M   E   N   U     */
  399.       /* --------------------- */
  400.       case  WM_COMMAND :
  401.         switch (wParam)
  402.          {
  403.  
  404.            case  CW_ABOUT :
  405.                Ftp4wVer (szBuf, sizeof szBuf);
  406.                Ecris (szBuf);
  407.                break;
  408.                        
  409.            case  CW_CONNECT :
  410.                Ecris ("--- Connection on %s  ---", HOST_NAME () );
  411.                Rc = FtpLogin ( HOST_NAME (), 
  412.                                USER_NAME (), 
  413.                                PASSWD_NAME (),
  414.                                hWnd, FTP_LOGGED);
  415.                Ecris ("Function returns %d", Rc);                              
  416.                break;
  417.  
  418.  
  419.            case CW_RCVAPPEND :
  420.            case CW_RECV :
  421.                Ecris ("Remote %s -> Local %s",REMOTEFILE_NAME (),LOCALFILE_NAME ());
  422.                bFileTransfer = TRUE;
  423.                if (IsOptOn(CW_GAUGE))
  424.                  {
  425.                     CreateXferWindow ();
  426.                     SetXferWindowText (LOCALFILE_NAME());
  427.                  }
  428.                if (wParam==CW_RCVAPPEND)
  429.                     Rc = FtpAppendToLocalFile ( REMOTEFILE_NAME (),
  430.                                   LOCALFILE_NAME (),
  431.                                   IsOptOn(CW_BINARY) ? TYPE_I : TYPE_A, 
  432.                                   IsOptOn(CW_GAUGE),
  433.                                   hWnd, 
  434.                                   FTP_FILETRANSFERED);
  435.                else                                   
  436.                     Rc = FtpRecvFile ( REMOTEFILE_NAME (),
  437.                                   LOCALFILE_NAME (),
  438.                                   IsOptOn(CW_BINARY) ? TYPE_I : TYPE_A, 
  439.                                   IsOptOn(CW_GAUGE),
  440.                                   hWnd, 
  441.                                   FTP_FILETRANSFERED);
  442.                if (! IsOptOn (CW_SYNC) )
  443.                  {       
  444.                     Ecris ("Taille %ld", FtpBytesToBeTransferred () );
  445.                     Ecris ("Async Recv returns %d %s", Rc, 
  446.                             Rc==0 ? "-> Cmd in progress" : "-> Cmd terminated");
  447.                     if (Rc!=0) bFileTransfer=FALSE;
  448.                  }
  449.                else  
  450.                 {
  451.                     DeleteXferWindow ();
  452.                     Ecris ("Recv returns %d", Rc);
  453.                     bFileTransfer = FALSE;
  454.                 }
  455.                break;
  456.  
  457.         
  458.  
  459.  
  460.            case CW_APPEND :
  461.            case CW_SEND :
  462.                Ecris ("Local %s -> Remote %s",LOCALFILE_NAME (),REMOTEFILE_NAME ());
  463.                bFileTransfer = TRUE;
  464.                if (IsOptOn(CW_GAUGE))
  465.                  {
  466.                     CreateXferWindow ();
  467.                     SetXferWindowText (LOCALFILE_NAME());
  468.                  }
  469.                if (wParam==CW_APPEND)
  470.                   Rc = FtpAppendToRemoteFile ( LOCALFILE_NAME (),
  471.                                                REMOTEFILE_NAME (),
  472.                                                IsOptOn(CW_BINARY)?TYPE_I:TYPE_A,
  473.                                                IsOptOn(CW_GAUGE),
  474.                                                hWnd, 
  475.                                               (LPARAM) FTP_FILETRANSFERED);
  476.                else  
  477.                   Rc = FtpSendFile ( LOCALFILE_NAME (),
  478.                                      REMOTEFILE_NAME (),
  479.                                      IsOptOn(CW_BINARY) ? TYPE_I : TYPE_A, 
  480.                                      IsOptOn(CW_GAUGE),
  481.                                      hWnd, 
  482.                                     (LPARAM) FTP_FILETRANSFERED);
  483.                if (! IsOptOn (CW_SYNC) )
  484.                  {       
  485.                     Ecris ("Taille %ld", FtpBytesToBeTransferred () );
  486.                     Ecris ("Async Send returns %d %s", Rc, 
  487.                             Rc==0 ? "-> Cmd in progress" : "-> Cmd terminated");
  488.                     if (Rc!=0)       bFileTransfer = FALSE;
  489.                  }
  490.                else
  491.                  {
  492.                     DeleteXferWindow ();
  493.                     Ecris ("Send returns %d", Rc);
  494.                     bFileTransfer = FALSE;
  495.                  }
  496.                break;
  497.  
  498.  
  499.            case CW_RCVRESTART :
  500.                Ecris ("Local %s -> Remote %s",LOCALFILE_NAME (),REMOTEFILE_NAME ());
  501.                bFileTransfer = TRUE;
  502.                if (IsOptOn(CW_GAUGE))
  503.                  {
  504.                     CreateXferWindow ();
  505.                     SetXferWindowText (LOCALFILE_NAME());
  506.                  }
  507.                hFile = _lcreat (LOCALFILE_NAME (), 0);
  508.                     Rc = FtpRestartRecvFile ( REMOTEFILE_NAME (),
  509.                                   hFile,
  510.                                   IsOptOn(CW_BINARY) ? TYPE_I : TYPE_A, 
  511.                                   IsOptOn(CW_GAUGE),
  512.                                   100l,
  513.                                   hWnd, 
  514.                                   FTP_FILETRANSFERED);
  515.                if (! IsOptOn (CW_SYNC) )
  516.                  {       
  517.                     Ecris ("Taille %ld", FtpBytesToBeTransferred () );
  518.                     Ecris ("Async Recv returns %d %s", Rc, 
  519.                             Rc==0 ? "-> Cmd in progress" : "-> Cmd terminated");
  520.                     if (Rc!=0) bFileTransfer=FALSE;
  521.                  }
  522.                else  
  523.                 {
  524.                     DeleteXferWindow ();
  525.                     Ecris ("Recv returns %d", Rc);
  526.                     bFileTransfer = FALSE;
  527.                 }
  528.                break;
  529.  
  530.            case CW_SHORTDIR :
  531.            case CW_LONGDIR :
  532.                Rc=FtpDir (NULL, "$$dir$$.tmp",wParam==CW_LONGDIR,hWnd,FTP_DIR);
  533.                if (Rc!=FTPERR_OK || IsOptOn(CW_SYNC))  
  534.                         PostMessage (hWnd, FTP_DIR, TRUE, Rc);
  535.                break;
  536.  
  537.            case CW_SHORTDIR_LL :
  538.            case CW_LONGDIR_LL :
  539.                if (IsOptOn (CW_SYNC))  
  540.                     DoAddLine ("You MUST be in Asynchronous Mode");
  541.                else     
  542.                  {
  543.                    Rc=FtpDir (NULL, NULL,wParam==CW_LONGDIR_LL,hWnd,FTP_DIRLINEPERLINE);
  544.                    Ecris ("FtpDir returns %d", Rc);
  545.                  }
  546.                break;
  547.  
  548.            case CW_CWD :
  549.               Rc = FtpCWD (REMOTE_DIR ());
  550.               Ecris ("CWD returns %d", Rc);
  551.               break;
  552.  
  553.            case CW_CDUP :
  554.               Rc = FtpCDUP ();
  555.               Ecris ("CDUP returns %d", Rc);
  556.               break;
  557.  
  558.            case CW_PWD :
  559.               Rc = FtpPWD (szBuf, sizeof szBuf);
  560.               if (Rc==FTPERR_OK)  Ecris ("Current dir : %s", szBuf);
  561.               else                Ecris ("FtpPWD returns %d", Rc);
  562.               break;
  563.  
  564.            case CW_RMD :
  565.               Rc = FtpRMD (REMOTE_DIR ());
  566.               Ecris ("ftpRMD returns %d", Rc);
  567.               break;
  568.  
  569.            case CW_MKD :
  570.               Rc = FtpMKD (REMOTE_DIR (), szBuf, sizeof szBuf);
  571.               /* szBuf should be the name of the created dir */
  572.               if (Rc==FTPERR_OK  && szBuf[0]!=0)  
  573.                         Ecris ("Dir %s Has been created", szBuf);
  574.               else      Ecris ("FtpMKD returns %d", Rc);
  575.               break;
  576.  
  577.  
  578.            case CW_DELETE :
  579.               Rc = FtpDeleteFile (REMOTEFILE_NAME ());
  580.               Ecris ("FtpDelete returns %d", Rc);
  581.               break;
  582.             
  583.            case CW_SYST :
  584.               Rc = FtpSyst (szSyst);
  585.               Ecris ("System returns %d -> %s", 
  586.                       Rc, Rc>=1000 ? 
  587.                           Rc==FTPERR_SYSTUNKNOWN ? "Unknown" :"Error" : 
  588.                           szSyst[Rc]);
  589.               break;
  590.  
  591.            case CW_RENAME :
  592.               Rc = FtpRenameFile (REMOTEFILE_NAME (), NEWREMOTEFILE_NAME ());
  593.               Ecris ("Rename returns %d", Rc);
  594.               break;
  595.  
  596.            case CW_FLUSH :
  597.               Rc = FtpFlush ();
  598.               Ecris ("Flush returns %d", Rc);
  599.               break;
  600.  
  601.            case CW_QUOTE :
  602.               lpfnQuoteDlg = MakeProcInstance ((FARPROC) CBQuoteDlg, hInst);
  603.               if (DialogBox(hInst, "QuoteDlg", hWnd, (DLGPROC)lpfnQuoteDlg)==0)
  604.                 {
  605.                     Ecris ("QUOTE %s", szQuoteCmd);
  606.                     Rc=FtpQuote (szQuoteCmd, NULL, 0);
  607.                     Ecris ("Quote returns %d", Rc);
  608.                  }
  609.               FreeProcInstance (lpfnQuoteDlg);
  610.               break;
  611.  
  612.  
  613.            case CW_ABORT :
  614.               Ecris ("Abort");
  615.               FtpAbort ();
  616.               break;  
  617.  
  618.  
  619.            case CW_DISCONNECT : 
  620.                if (bFileTransfer)
  621.                   {
  622.                      Ecris ("File transfer in progress, can not close session");
  623.                   }
  624.                else
  625.                   {
  626.                      Rc = FtpCloseConnection ();
  627.                      Ecris ("FtpCloseConnection returns %d", Rc);
  628.                   }
  629.                break;
  630.  
  631.  
  632.            case CW_QUIT : 
  633.                 PostMessage (hWnd, WM_CLOSE, 0, 0l);
  634.                 break;
  635.                                      
  636.            case CW_SYNC : 
  637.                if (bFileTransfer)
  638.                  {
  639.                    MessageBox (NULL, "Can not change now", "CW_MAIN", MB_OK);
  640.                  }
  641.                else
  642.                  {
  643.                    if (! IsOptOn (CW_SYNC))
  644.                       {
  645.                           CheckMenuItem (GetMenu (hWnd), CW_SYNC, 
  646.                                          MF_BYCOMMAND  | MF_CHECKED);
  647.                           FtpSetSynchronousMode ();
  648.                        }
  649.                    else   
  650.                       {
  651.                           CheckMenuItem (GetMenu (hWnd), CW_SYNC, 
  652.                                          MF_BYCOMMAND  | MF_UNCHECKED);
  653.                           FtpSetAsynchronousMode ();
  654.                        }
  655.                  }
  656.                break;      
  657.                      
  658.            case CW_SETVERB :
  659.                if (IsOptOn (CW_SETVERB))
  660.                    
  661.                  {                
  662.                    CheckMenuItem (GetMenu (hWnd), CW_SETVERB, 
  663.                                   MF_BYCOMMAND  | MF_UNCHECKED);
  664.                    FtpSetVerboseMode (FALSE, hWnd, CW_VERBOSE);
  665.                  }
  666.                else
  667.                  {                
  668.                    CheckMenuItem (GetMenu (hWnd), CW_SETVERB, 
  669.                                   MF_BYCOMMAND  | MF_CHECKED);
  670.                    FtpSetVerboseMode (TRUE, hWnd, CW_VERBOSE);
  671.                  }
  672.                break; 
  673.  
  674.  
  675.            case CW_GAUGE :
  676.                CheckMenuItem (GetMenu (hWnd), CW_GAUGE, MF_BYCOMMAND  | 
  677.                               IsOptOn(CW_GAUGE) ? MF_UNCHECKED : MF_CHECKED); 
  678.                /* pause (for display) each 3 frames if gauge is on */
  679.                if IsOptOn(CW_GAUGE)   FtpSetNewSlices(3, 1);
  680.                else                   FtpSetNewSlices(10, 3);
  681.                break; 
  682.  
  683.  
  684.            case CW_LOG :
  685.                CheckMenuItem (GetMenu (hWnd), CW_LOG, MF_BYCOMMAND  | 
  686.                               IsOptOn(CW_LOG) ? MF_UNCHECKED : MF_CHECKED); 
  687.                if IsOptOn(CW_LOG)   hLogFile =  _lcreat (LOG_FILE, 0);
  688.                else                 
  689.                     {
  690.                       _lclose (hLogFile); 
  691.                       hLogFile = HFILE_ERROR;
  692.                     }
  693.                FtpLogTo (hLogFile);
  694.                break; 
  695.                 
  696.                 
  697.            case CW_BINARY :
  698.                CheckMenuItem (GetMenu (hWnd), CW_BINARY, MF_BYCOMMAND  | 
  699.                               IsOptOn(CW_BINARY) ? MF_UNCHECKED : MF_CHECKED);
  700.                break; 
  701.                 
  702.                 
  703.            case CW_PASSIVE :
  704.                CheckMenuItem (GetMenu (hWnd), CW_PASSIVE, MF_BYCOMMAND  | 
  705.                               IsOptOn(CW_PASSIVE) ? MF_UNCHECKED : MF_CHECKED);
  706.                FtpSetPassiveMode (IsOptOn (CW_PASSIVE));
  707.                break; 
  708.                 
  709.           case CW_EDITINI :
  710.                GetWindowsDirectory (szWinDir, sizeof szWinDir);
  711.                wsprintf (szExecCmd, "NotePad %s\\%s", szWinDir, INIFILE_NAME);
  712.                WinExec (szExecCmd, SW_SHOW);
  713.                break;
  714.                 
  715.             } /* WM_COMMAND */
  716.     }
  717. return DefWindowProc(hWnd, message, wParam, lParam);
  718. } /* Boucle Windows */
  719.  
  720.  
  721.  
  722.  
  723. /* ******************************************************************* */
  724. int PASCAL WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
  725.                         LPSTR lpszCmdLine, int nCmdShow)
  726. {
  727. MSG   msg;
  728.  
  729.     hInst = hInstance;       /* save for use by window procs */
  730.     FirstEmission = (hPrevInstance==NULL);
  731.  
  732.     // Go init this application
  733.     if (    !hPrevInstance  &&  !InitApplication(hInstance) )
  734.         return   FALSE;      /* Exits if unable to initialize */
  735.     if (!InitInstance(hInstance, nCmdShow))   return FALSE;
  736.  
  737.     /* Get and dispatch messages for this applicaton.*/
  738.     while (GetMessage(&msg, NULL, 0, 0))
  739.       {
  740.         TranslateMessage(&msg);
  741.         DispatchMessage(&msg);                  
  742.       }
  743.     UnregisterClass (szAPPLICATION, hInstance);  
  744.     nCwRegisterClasses();
  745.    _lclose (hLogFile); 
  746. return  msg.wParam;
  747. } /* WinMain */
  748.  
  749.  
  750. /* ******************************************************************* */
  751.  
  752. BOOL InitApplication (HINSTANCE hInstance)
  753. {
  754. WNDCLASS wndClass;
  755.  
  756.      wndClass.lpszClassName = szAPPLICATION;
  757.      wndClass.lpszMenuName  = szAPPLICATION;
  758.      wndClass.hInstance     = hInstance;
  759.      wndClass.lpfnWndProc   = MainWndProc;
  760.      wndClass.hCursor       = LoadCursor(hInstance, IDC_ARROW);
  761.      wndClass.hIcon         = LoadIcon  (hInstance, "CW_MAIN");
  762.      wndClass.hbrBackground = (HBRUSH) (1 + COLOR_WINDOW);
  763.      wndClass.style         = CS_VREDRAW | CS_HREDRAW;
  764.      wndClass.cbClsExtra    = 0;
  765.      wndClass.cbWndExtra    = 0;
  766.    // Register the class
  767. return  RegisterClass (&wndClass);
  768. }  /* InitApplication */
  769.       
  770.       
  771.  
  772.  
  773. BOOL InitInstance (HINSTANCE hInstance, int nCmdShow)
  774. {
  775. HWND       hWnd;
  776. HINSTANCE  hDLLInst;
  777.  
  778.     hWnd = CreateWindow(
  779.                     szAPPLICATION,     // window class name
  780.                     szAPPLICATION,     // window title
  781.                     WS_OVERLAPPEDWINDOW | WS_HSCROLL | WM_VSCROLL | WS_VISIBLE,
  782.                     CW_USEDEFAULT,          // x - same as dialog box
  783.                     CW_USEDEFAULT,          // y
  784.                     490,                     // cx
  785.                     250,                     // cy
  786.                     NULL,                    // no parent for this window
  787.                     NULL,                    // use the class menu
  788.                     hInstance,               // who created this window
  789.                     NULL                     // no parms to pass on
  790.           );
  791.     if (hWnd==0)  return FALSE;
  792.     ShowWindow (hWnd, nCmdShow);
  793.     UpdateWindow (hWnd);
  794. return TRUE;
  795. }  /* InitInstance */
  796.  
  797.  
  798.  
  799.  
  800.  
  801.